﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using EntidadesCompartidas;
using System.Data.SqlClient;
using System.Data;

using Persistencia.Properties;

namespace Persistencia.Datos
{
    public class PersPlano:Interfaces.IPersPlano
    {
        //Elementos que determinan el singleton
        //1- Atributo de Clase
        private static PersPlano _miPersistenciaPlano = null;
        //2- Constructor
        private PersPlano() { }
        //3- Metodo de Clase
        public static PersPlano GetPlano()
        {
            if (_miPersistenciaPlano == null)
            {
                _miPersistenciaPlano = new PersPlano();
            }
            return _miPersistenciaPlano;

        }
        /////////////////////////////////////////////////////////////////////////////////////////////

        #region Miembros de IPersPlano
        //----------------------------------------------------------------------------------------------------------------------------------------------
        public Plano BuscarPlano(int pId)
        {
            string _foto;
            int _idc;
         //   int _idp;
            Plano _elPlano = null;
            List<Luz> _luces = new List<Luz>();
            List<Sensor> _sensores = new List<Sensor>();
            List<Camara> _camaras = new List<Camara>();
            
            SqlConnection _1conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            SqlDataReader _1lector;
            SqlTransaction _Tran = null;
            bool OK = false;
            
            try
            {
                _1conexion.Open();
                _Tran = _1conexion.BeginTransaction();
                string consulta = "select * from Planos where Idp = " + pId + " and EliminacionLogica = 1";
               // string consulta = "select p.* from planos p, Casas c where p.EliminacionLogica = 1 and p.Idc = c.Idc and c.CI = " + pId;
                
                SqlCommand _1comando = new SqlCommand(consulta, _1conexion);
                _1comando.Transaction = _Tran;
                _1lector = _1comando.ExecuteReader();
                if (_1lector.Read())
                {
                    _foto = (string)_1lector["Foto"];
                    _idc = (int)_1lector["Idc"];
                //    _idp = (int)_1lector["Idp"];
                    Casa _laCasa = FabricaPersistencia.getPersCasa().BuscarCasa(_idc);
                    //---------------------- 2 conexion luces------------------------------------------------
                    SqlConnection _2conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
                    _2conexion.Open();
                    string _2consulta = "select * from Luces where Idp = " + pId + " and EliminacionLogica = 1";
                    SqlCommand _2comando = new SqlCommand(_2consulta, _2conexion);
                    SqlDataReader _2lector = _2comando.ExecuteReader();
                    while (_2lector.Read()) 
                    {   int _id = (int)_2lector["Id"]; 
                        bool _estado = (bool)_2lector["Estado"];
                        decimal _ejex = (decimal)_2lector["EjeX"];
                        decimal _ejey = (decimal)_2lector["EjeY"];
                        Luz _unaLuz = new Luz(_id, _estado, _ejex, _ejey);
                        _luces.Add(_unaLuz);
                        OK = true;
                    }
                    _2lector.Close();
                    _2conexion.Close();
                    //----------------------end 2 conexion ------------------------------------------------
                    //---------------------- 3 conexion sensores------------------------------------------------
                    SqlConnection _3conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
                    _3conexion.Open();
                    string _3consulta = "select * from Sensores where Idp = " + pId + " and EliminacionLogica = 1";
                    SqlCommand _3comando = new SqlCommand(_3consulta, _3conexion);
                    SqlDataReader _3lector = _3comando.ExecuteReader();
                    while (_3lector.Read())
                    {
                        int _id = (int)_3lector["Id"];
                        bool _estado = (bool)_3lector["Estado"];
                        decimal _ejex = (decimal)_3lector["EjeX"];
                        decimal _ejey = (decimal)_3lector["EjeY"];
                        Sensor _unSensor = new Sensor(_id, _estado, _ejex, _ejey);
                        _sensores.Add(_unSensor);
                        OK = true;
                    }
                    _3lector.Close();
                    _3conexion.Close();
                    //----------------------end 3 conexion ------------------------------------------------
                    //---------------------- 4 conexion camaras------------------------------------------------
                    SqlConnection _4conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
                    _4conexion.Open();
                    string _4consulta = "select * from Camaras where Idp = " + pId + " and EliminacionLogica = 1";
                    SqlCommand _4comando = new SqlCommand(_4consulta, _4conexion);
                    SqlDataReader _4lector = _4comando.ExecuteReader();
                    while (_4lector.Read())
                    {
                        string _id = (string)_4lector["DirRtsp"];
                        bool _estado = (bool)_4lector["Estado"];
                        decimal _ejex = (decimal)_4lector["EjeX"];
                        decimal _ejey = (decimal)_4lector["EjeY"];
                        Camara _unaCamara = new Camara(_id, _estado, _ejex, _ejey);
                        _camaras.Add(_unaCamara);
                        OK = true;
                    }
                    _4lector.Close();
                    _4conexion.Close();
                    //----------------------end 4 conexion ------------------------------------------------

                    _elPlano = new Plano(pId, _foto, _laCasa,_luces,_sensores,_camaras);
                    OK = true;
                }
                _1lector.Close();
                if (OK)
                {
                    _Tran.Commit();
                }
                else
                {
                    _Tran.Rollback();
                }

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _1conexion.Close();
            }
            return _elPlano;
        }
        //----------------------------------------------------------------------------------------------------------------------------------------------
        public List<Plano> ListarPlanosXcasa(Casa pCasa)
        {       
            int _idp;
            string _foto;
            int _idc;

            List<Plano> _lista = new List<Plano>();

            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            string consulta = "select * from Planos where Idc= "+ pCasa.Id +" and EliminacionLogica = 1";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);

            SqlDataReader _lector;

            try
            {
                _conexion.Open();
                _lector = _comando.ExecuteReader();
                while (_lector.Read())
                {
                    Plano _elPlano = new Plano();
                    _idp = (int)_lector["Idp"];
                    _foto = (string)_lector["Foto"];
                    _idc = (int)_lector["Idc"];
                    Casa _laCasa = FabricaPersistencia.getPersCasa().BuscarCasa(_idc);
                    _elPlano = new Plano(_idp, _foto, _laCasa);

                    _lista.Add(_elPlano);
                }
                _lector.Close();

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }
            return _lista;
        }
        //----------------------------------------------------------------------------------------------------------------------------------------------
        public int AltaImagenPlano(Plano pPlano)
        {
            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            string consulta = "insert into Planos(Foto,Idc,EliminacionLogica) values('" +
                                 pPlano.Foto+ "'," +
                                 pPlano.LaCasa.Id + ",1)";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);
            int _afectados = -1;
            try
            {
                _conexion.Open();
                _afectados = _comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }

            return _afectados;
        }
        //----------------------------------------------------------------------------------------------------------------------------------------------
        public int ModificarImagenPlano(Plano pPlano)
        {
            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            string consulta = "update Planos set Foto='"+pPlano.Foto +"' where Idp = " + pPlano.Idp + " and EliminacionLogica = 1";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);
            int _afectados = -1;
            try
            {
                _conexion.Open();
                _afectados = _comando.ExecuteNonQuery();                
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }

            return _afectados;
        }
        //----------------------------------------------------------------------------------------------------------------------------------------------
        //public int ModificarColeccionesPlano(Plano pPlano)
        //{
        // int _afectados = -1;

        // SqlConnection _1conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
        // SqlTransaction _miTran = null;
        // bool _Ok = false;
        // try
        // {
        //     _1conexion.Open();
        //     //-- tran --
        //     _miTran = _1conexion.BeginTransaction();
        //     //-----------1 modificar luces ------------------
        //     foreach (Luz _unaLuz in pPlano.Luces)
        //     {
        //         string xx = _unaLuz.Ejex.ToString();
        //         string ejex = xx.Replace(",", ".");
        //         string yy = _unaLuz.Ejey.ToString();
        //         string ejey = yy.Replace(",", ".");
        //         SqlCommand _1comando = null;
        //         //if (_unaLuz.Id == 0)
        //         //{
        //         string _1consulta = "insert into Luces(id,Estado,EjeX,EjeY,Idp,EliminacionLogica) values(" + _unaLuz.Id + ",0," + ejex + "," + ejey + "," + pPlano.Idp + ",1)";
        //             _1comando = new SqlCommand(_1consulta, _1conexion);
        //         //}
        //         //else
        //         //{
        //         //    string _1consulta = "update Luces set EjeX=" + _unaLuz.Ejex + ", EjeY=" + ejex + " where Id = " + ejey + " and EliminacionLogica = 1";
        //         //    _1comando = new SqlCommand(_1consulta, _1conexion);
        //         //}
        //         //--   --
        //         _1comando.Transaction = _miTran;
        //         _afectados = _1comando.ExecuteNonQuery();
        //         _Ok = (_afectados == 1);
        //     }//-----------2 modificar sensores ------------------
        //     foreach (Sensor _unSensor in pPlano.Sensores)
        //     {
        //         string xx = _unSensor.Ejex.ToString();
        //         string ejex = xx.Replace(",", ".");
        //         string yy = _unSensor.Ejey.ToString();
        //         string ejey = yy.Replace(",", ".");
        //         SqlCommand _2comando = null;
        //         //if (_unSensor.Id == 0)
        //         //{
        //         string _2consulta = "insert into Sensores(id,Estado,EjeX,EjeY,Idp,EliminacionLogica) values(" + _unSensor.Id + ",0," + ejex + "," + ejey + "," + pPlano.Idp + ",1)";
        //             _2comando = new SqlCommand(_2consulta, _1conexion);
        //         //}
        //         //else
        //         //{
        //         //    string _2consulta = "update Sensores set EjeX=" + ejex + ", EjeY=" + ejey + " where Id = " + _unSensor.Id + " and EliminacionLogica = 1";
        //         //    _2comando = new SqlCommand(_2consulta, _1conexion);
        //         //}
        //        //-- tran --
        //         _2comando.Transaction = _miTran;
        //         _afectados = _2comando.ExecuteNonQuery();
        //         _Ok = (_afectados == 1);
        //     }//-----------3 modificar Camaras ------------------
        //     foreach (Camara _unaCamara in pPlano.Camaras)
        //     {
        //         string xx = _unaCamara.Ejex.ToString();
        //         string ejex = xx.Replace(",", ".");
        //         string yy = _unaCamara.Ejey.ToString();
        //         string ejey = yy.Replace(",", ".");
        //         SqlCommand _3comando = null;
        //         if (_unaCamara.DirRtsp != "")
        //         {
        //             string _3consulta = "insert into Camaras(DirRtsp,Estado,EjeX,EjeY,Idp,EliminacionLogica) values('" + _unaCamara.DirRtsp + "',0," + ejex + "," + ejey + "," + pPlano.Idp + ",1)";
        //             _3comando = new SqlCommand(_3consulta, _1conexion);
        //         }
        //         //else
        //         //{
        //         //    string _3consulta = "update Camaras set EjeX=" + _unaCamara.Ejex + ", EjeY=" + ejex + " where Id = " + ejey + " and EliminacionLogica = 1";
        //         //    _3comando = new SqlCommand(_3consulta, _1conexion);
        //         //}
        //         //-- tran --
        //         _3comando.Transaction = _miTran;
        //         _afectados = _3comando.ExecuteNonQuery();
        //         _Ok = (_afectados == 1);
        //     }
        //     if (_Ok)
        //         _miTran.Commit();
        //     else
        //         _miTran.Rollback();
        // }
        // catch (Exception ex)
        // {
        //     throw new Exception(ex.Message);
        // }
        // finally
        // {
        //     _1conexion.Close();
        // }
        //return _afectados;
        //}
        //----------------------------------------------------------------------------------------------------------------------------------------------

        //----------------------------------------------------------------------------------------------------------------------------------------------
        public int AgregarColeccionesPlano(Plano pPlano)
        {
            int _afectados = -1;

            SqlConnection _1conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            SqlTransaction _miTran = null;
            bool _Ok = false;
            try
            {
                _1conexion.Open();
                //-- tran --
                _miTran = _1conexion.BeginTransaction();
                //-----------1 modificar luces ------------------
                foreach (Luz _unaLuz in pPlano.Luces)
                {
                    string xx = _unaLuz.Ejex.ToString();
                    string ejex = xx.Replace(",", ".");
                    string yy = _unaLuz.Ejey.ToString();
                    string ejey = yy.Replace(",", ".");
                    SqlCommand _1comando = null;
                    string _1consulta = "insert into Luces(id,Estado,EjeX,EjeY,Idp,EliminacionLogica) values(" + _unaLuz.Id + ",0," + ejex + "," + ejey + "," + pPlano.Idp + ",1)";
                    _1comando = new SqlCommand(_1consulta, _1conexion);
                    _1comando.Transaction = _miTran;
                    _afectados = _1comando.ExecuteNonQuery();
                    _Ok = (_afectados == 1);
                }//-----------2 modificar sensores ------------------
                foreach (Sensor _unSensor in pPlano.Sensores)
                {
                    string xx = _unSensor.Ejex.ToString();
                    string ejex = xx.Replace(",", ".");
                    string yy = _unSensor.Ejey.ToString();
                    string ejey = yy.Replace(",", ".");
                    SqlCommand _2comando = null;
                    string _2consulta = "insert into Sensores(id,Estado,EjeX,EjeY,Idp,EliminacionLogica) values(" + _unSensor.Id + ",0," + ejex + "," + ejey + "," + pPlano.Idp + ",1)";
                    _2comando = new SqlCommand(_2consulta, _1conexion);
                    //-- tran --
                    _2comando.Transaction = _miTran;
                    _afectados = _2comando.ExecuteNonQuery();
                    _Ok = (_afectados == 1);
                }//-----------3 modificar Camaras ------------------
                foreach (Camara _unaCamara in pPlano.Camaras)
                {
                    string xx = _unaCamara.Ejex.ToString();
                    string ejex = xx.Replace(",", ".");
                    string yy = _unaCamara.Ejey.ToString();
                    string ejey = yy.Replace(",", ".");
                    SqlCommand _3comando = null;
                    if (_unaCamara.DirRtsp != "")
                    {
                        string _3consulta = "insert into Camaras(DirRtsp,Estado,EjeX,EjeY,Idp,EliminacionLogica) values('" + _unaCamara.DirRtsp + "',0," + ejex + "," + ejey + "," + pPlano.Idp + ",1)";
                        _3comando = new SqlCommand(_3consulta, _1conexion);
                    }
                    //-- tran --
                    _3comando.Transaction = _miTran;
                    _afectados = _3comando.ExecuteNonQuery();
                    _Ok = (_afectados == 1);
                }
                if (_Ok)
                    _miTran.Commit();
                else
                    _miTran.Rollback();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                _1conexion.Close();
            }
            return _afectados;
        }
        //----------------------------------------------------------------------------------------------------------------------------------------------
        public int EliminarPlano(Plano pPlano)
        {
            int _afectados = -1;

            SqlConnection _1conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            SqlTransaction _miTran = null;
            bool _Ok = false;
        try{
                _1conexion.Open();
                //-- tran --
                _miTran = _1conexion.BeginTransaction();
                //-----------1 modificar luces ------------------
                foreach (Luz _unaLuz in pPlano.Luces)
                {
                    SqlCommand _1comando = null;
                    string _1consulta = "update Luces set EliminacionLogica=" + 0 + " where Id = " + _unaLuz.Id + " and EliminacionLogica = 1";
                    _1comando = new SqlCommand(_1consulta, _1conexion);
                    //--   --
                    _1comando.Transaction = _miTran;
                    _afectados = _1comando.ExecuteNonQuery() ;
                    _Ok = (_afectados == 1);
                }//-----------2 modificar sensores ------------------
                foreach (Sensor _unSensor in pPlano.Sensores)
                {
                    SqlCommand _2comando = null;
                    string _2consulta = "update Sensores set EliminacionLogica=" + 0 + " where Id = " + _unSensor.Id + " and EliminacionLogica = 1";
                        _2comando = new SqlCommand(_2consulta, _1conexion);
                    //-- tran --
                    _2comando.Transaction = _miTran;
                    _afectados = _2comando.ExecuteNonQuery();
                    _Ok = _Ok && (_afectados == 1);    
                }//-----------3 modificar Camaras ------------------
                foreach (Camara _unaCamara in pPlano.Camaras)
                {
                    SqlCommand _3comando = null;
                    string _3consulta = "update Camaras set EliminacionLogica=" + 0 + " where Id = '" + _unaCamara.DirRtsp  + "' and EliminacionLogica = 1";
                        _3comando = new SqlCommand(_3consulta, _1conexion);
                    //-- tran --
                    _3comando.Transaction = _miTran;
                    _afectados = _3comando.ExecuteNonQuery();
                    _Ok = _Ok && (_afectados == 1);
                }//-----------3 ELIMINAR el plano ------------------
                SqlCommand _4comando = null;
                string _4consulta = "update Planos set EliminacionLogica=" + 0 + " where Idp = " + pPlano.Idp + " and EliminacionLogica = 1";
                _4comando = new SqlCommand(_4consulta, _1conexion);
                //-- tran --
                _4comando.Transaction = _miTran;
                _afectados =  _4comando.ExecuteNonQuery();   
                _Ok = _Ok && (_afectados == 1);
                
                if (_Ok)
                    _miTran.Commit();
                else
                    _miTran.Rollback();
            
            }
         catch (Exception ex)
         {
             throw new Exception(ex.Message);
         }
         finally
         {
             _1conexion.Close();
         }
        return _afectados;
        }
        //----------------------------------------------------------------------------------------------------------------------------------------------

        public int EliminarColeccionesPlano(Plano pPlano)
        {
            int _afectados = -1;

            SqlConnection _1conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            SqlTransaction _miTran = null;
            bool _Ok = false;
            try
            {
                _1conexion.Open();
                //-- tran --
                _miTran = _1conexion.BeginTransaction();
                //-----------1 modificar luces ------------------
                foreach (Luz _unaLuz in pPlano.Luces)
                {
                    string xx = _unaLuz.Ejex.ToString();
                    string ejex = xx.Replace(",", ".");
                    string yy = _unaLuz.Ejey.ToString();
                    string ejey = yy.Replace(",", ".");
                    SqlCommand _1comando = null;
                    string _1consulta = "delete from Luces where id =" + _unaLuz.Id + " and idp= "+ pPlano.Idp;
                    _1comando = new SqlCommand(_1consulta, _1conexion);
                    _1comando.Transaction = _miTran;
                    _afectados = _1comando.ExecuteNonQuery();
                    _Ok = (_afectados == 1);
                }//-----------2 modificar sensores ------------------
                foreach (Sensor _unSensor in pPlano.Sensores)
                {
                    string xx = _unSensor.Ejex.ToString();
                    string ejex = xx.Replace(",", ".");
                    string yy = _unSensor.Ejey.ToString();
                    string ejey = yy.Replace(",", ".");
                    SqlCommand _2comando = null;
                    string _2consulta = "delete from Sensores where id =" + _unSensor.Id + " and idp= " + pPlano.Idp;
                    _2comando = new SqlCommand(_2consulta, _1conexion);
                    //-- tran --
                    _2comando.Transaction = _miTran;
                    _afectados = _2comando.ExecuteNonQuery();
                    _Ok = (_afectados == 1);
                }//-----------3 modificar Camaras ------------------
                foreach (Camara _unaCamara in pPlano.Camaras)
                {
                    string xx = _unaCamara.Ejex.ToString();
                    string ejex = xx.Replace(",", ".");
                    string yy = _unaCamara.Ejey.ToString();
                    string ejey = yy.Replace(",", ".");
                    SqlCommand _3comando = null;
                    if (_unaCamara.DirRtsp != "")
                    {
                        string _3consulta = "delete from Camaras where DirRtsp = '" + _unaCamara.DirRtsp + "'" + " and idp= " + pPlano.Idp;
                        _3comando = new SqlCommand(_3consulta, _1conexion);
                    }
                    //-- tran --
                    _3comando.Transaction = _miTran;
                    _afectados = _3comando.ExecuteNonQuery();
                    _Ok = (_afectados == 1);
                }
                if (_Ok)
                    _miTran.Commit();
                else
                    _miTran.Rollback();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                _1conexion.Close();
            }
            return _afectados;
        }
        //----------------------------------------------------------------------------------------------------------------------------------------------
        #endregion
    }
}
